1 /*! Copyright (c) 2008 Brandon Aaron (http://brandonaaron.net)
2  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
3  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
4  *
5  * Version:
1.0.3
6  * Requires jQuery
1.1.3+
7  * Docs: http://docs.jquery.com/Plugins/livequery
8  */

9
10 (function($) {
11     
12 $.extend($.fn, {
13     livequery: function(type, fn, fn2) {
14         
var self = this, q;
15         
16         
// Handle different call patterns
17         
if ($.isFunction(type))
18             fn2 = fn, fn = type, type = undefined;
19             
20         
// See if Live Query already exists
21         $.each( $.livequery.queries, function(i, query) {
22             
if ( self.selector == query.selector && self.context == query.context &&
23                 type == query.type && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) )
24                     
// Found the query, exit the each loop
25                     
return (q = query) && false;
26         });
27         
28         
// Create new Live Query if it wasn't found
29         q = q ||
new $.livequery(this.selector, this.context, type, fn, fn2);
30         
31         
// Make sure it is running
32         q.stopped =
false;
33         
34         
// Run it immediately for the first time
35         q.run();
36         
37         
// Contnue the chain
38         
return this;
39     },
40     
41     expire: function(type, fn, fn2) {
42         
var self = this;
43         
44         
// Handle different call patterns
45         
if ($.isFunction(type))
46             fn2 = fn, fn = type, type = undefined;
47             
48         
// Find the Live Query based on arguments and stop it
49         $.each( $.livequery.queries, function(i, query) {
50             
if ( self.selector == query.selector && self.context == query.context &&
51                 (!type || type == query.type) && (!fn || fn.$lqguid == query.fn.$lqguid) && (!fn2 || fn2.$lqguid == query.fn2.$lqguid) && !
this.stopped )
52                     $.livequery.stop(query.id);
53         });
54         
55         
// Continue the chain
56         
return this;
57     }
58 });
59
60 $.livequery = function(selector, context, type, fn, fn2) {
61     
this.selector = selector;
62     
this.context = context || document;
63     
this.type = type;
64     
this.fn = fn;
65     
this.fn2 = fn2;
66     
this.elements = [];
67     
this.stopped = false;
68     
69     
// The id is the index of the Live Query in $.livequery.queries
70     
this.id = $.livequery.queries.push(this)-1;
71     
72     
// Mark the functions for matching later on
73     fn.$lqguid = fn.$lqguid || $.livequery.guid++;
74     
if (fn2) fn2.$lqguid = fn2.$lqguid || $.livequery.guid++;
75     
76     
// Return the Live Query
77     
return this;
78 };
79
80 $.livequery.prototype = {
81     stop: function() {
82         
var query = this;
83         
84         
if ( this.type )
85             
// Unbind all bound events
86             
this.elements.unbind(this.type, this.fn);
87         
else if (this.fn2)
88             
// Call the second function for all matched elements
89             
this.elements.each(function(i, el) {
90                 query.fn2.apply(el);
91             });
92             
93         
// Clear out matched elements
94         
this.elements = [];
95         
96         
// Stop the Live Query from running until restarted
97         
this.stopped = true;
98     },
99     
100     run: function() {
101         
// Short-circuit if stopped
102         
if ( this.stopped ) return;
103         
var query = this;
104         
105         
var oEls = this.elements,
106             els = $(
this.selector, this.context),
107             nEls = els.not(oEls);
108         
109         
// Set elements to the latest set of matched elements
110         
this.elements = els;
111         
112         
if (this.type) {
113             
// Bind events to newly matched elements
114             nEls.bind(
this.type, this.fn);
115             
116             
// Unbind events to elements no longer matched
117             
if (oEls.length > 0)
118                 $.each(oEls, function(i, el) {
119                     
if ( $.inArray(el, els) < 0 )
120                         $.
event.remove(el, query.type, query.fn);
121                 });
122         }
123         
else {
124             
// Call the first function for newly matched elements
125             nEls.each(function() {
126                 query.fn.apply(
this);
127             });
128             
129             
// Call the second function for elements no longer matched
130             
if ( this.fn2 && oEls.length > 0 )
131                 $.each(oEls, function(i, el) {
132                     
if ( $.inArray(el, els) < 0 )
133                         query.fn2.apply(el);
134                 });
135         }
136     }
137 };
138
139 $.extend($.livequery, {
140     guid:
0,
141     queries: [],
142     queue: [],
143     running:
false,
144     timeout:
null,
145     
146     checkQueue: function() {
147         
if ( $.livequery.running && $.livequery.queue.length ) {
148             
var length = $.livequery.queue.length;
149             
// Run each Live Query currently in the queue
150             
while ( length-- )
151                 $.livequery.queries[ $.livequery.queue.shift() ].run();
152         }
153     },
154     
155     pause: function() {
156         
// Don't run anymore Live Queries until restarted
157         $.livequery.running =
false;
158     },
159     
160     play: function() {
161         
// Restart Live Queries
162         $.livequery.running =
true;
163         
// Request a run of the Live Queries
164         $.livequery.run();
165     },
166     
167     registerPlugin: function() {
168         $.each( arguments, function(i,n) {
169             
// Short-circuit if the method doesn't exist
170             
if (!$.fn[n]) return;
171             
172             
// Save a reference to the original method
173             
var old = $.fn[n];
174             
175             
// Create a new method
176             $.fn[n] = function() {
177                 
// Call the original method
178                 
var r = old.apply(this, arguments);
179                 
180                 
// Request a run of the Live Queries
181                 $.livequery.run();
182                 
183                 
// Return the original methods result
184                 
return r;
185             }
186         });
187     },
188     
189     run: function(id) {
190         
if (id != undefined) {
191             
// Put the particular Live Query in the queue if it doesn't already exist
192             
if ( $.inArray(id, $.livequery.queue) < 0 )
193                 $.livequery.queue.push( id );
194         }
195         
else
196             
// Put each Live Query in the queue if it doesn't already exist
197             $.each( $.livequery.queries, function(id) {
198                 
if ( $.inArray(id, $.livequery.queue) < 0 )
199                     $.livequery.queue.push( id );
200             });
201         
202         
// Clear timeout if it already exists
203         
if ($.livequery.timeout) clearTimeout($.livequery.timeout);
204         
// Create a timeout to check the queue and actually run the Live Queries
205         $.livequery.timeout = setTimeout($.livequery.checkQueue,
20);
206     },
207     
208     stop: function(id) {
209         
if (id != undefined)
210             
// Stop are particular Live Query
211             $.livequery.queries[ id ].stop();
212         
else
213             
// Stop all Live Queries
214             $.each( $.livequery.queries, function(id) {
215                 $.livequery.queries[ id ].stop();
216             });
217     }
218 });

219
220 // Register core DOM manipulation methods

221 $.livequery.registerPlugin(
'append', 'prepend', 'after', 'before', 'wrap', 'attr', 'removeAttr', 'addClass', 'removeClass', 'toggleClass', 'empty', 'remove');
222
223 // Run Live Queries
when the Document is ready
224 $(function() { $.livequery.play(); });

225
226
227 // Save a reference to the original init method

228 var
init = $.prototype.init;
229
230 // Create a
new init method that exposes two new properties: selector and context
231 $.prototype.init = function(a,c) {
232     
// Call the original init and save the result
233     
var r = init.apply(this, arguments);
234     
235     
// Copy over properties if they exist already
236     
if (a && a.selector)
237         r.context = a.context, r.selector = a.selector;
238         
239     
// Set properties
240     
if ( typeof a == 'string' )
241         r.context = c || document, r.selector = a;
242     
243     
// Return the result
244     
return r;
245 };

246
247 // Give the init function the jQuery prototype
for later instantiation (needed after Rev 4091)
248 $.prototype.init.prototype = $.prototype;
249     
250 })(jQuery);



Full source code website bán hàng thương mại điện tử gần giống shopee 469.161 lượt xem

Gõ tìm kiếm nhanh...